/**
 * 
 */
package com.ztesoft.web.common.service.impl;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ztesoft.core.common.Page;
import com.ztesoft.core.convert.IArgConversionService;
import com.ztesoft.core.idproduce.ISequenceGenerator;
import com.ztesoft.framework.exception.BaseAppException;
import com.ztesoft.framework.log.ZTEsoftLogManager;
import com.ztesoft.web.common.db.arg.DbBaseInfoArg;
import com.ztesoft.web.common.db.arg.DbBaseInfoArg.DbBaseInfoCriteria;
import com.ztesoft.web.common.db.dao.DbBaseInfoDao;
import com.ztesoft.web.common.db.po.DbBaseInfoPO;
import com.ztesoft.web.common.service.IDbBaseInfoService;
import com.ztesoft.web.common.vo.DbBaseInfoVO;
import com.ztesoft.web.common.vo.DbLinkInstanceVO;
import com.ztesoft.web.common.vo.DbUserInfoVO;
import com.ztesoft.web.syncbaseinfo.service.BaseInfoService;

/**
 * <Description> <br>
 * 
 * @author codeCreater<br>
 * @version 1.0<br>
 * @taskId <br>
 * @CreateDate 2014年11月11日 <br>
 * @since V1.0<br>
 * @see com.ztesoft.web.common.service.impl <br>
 */

@Service("dbBaseInfoService")
public class DbBaseInfoServiceImpl implements IDbBaseInfoService {

    private static final ZTEsoftLogManager logger = ZTEsoftLogManager
            .getLogger(DbBaseInfoServiceImpl.class);

    @Autowired
    private DbBaseInfoDao dbBaseInfoDao;
	@Autowired
	private BaseInfoService baseInfoService;

    /**
     * 查询条件转换成Arg类的服务接口
     */
    @Resource(name = "defaultArgConversionService")
    private IArgConversionService argConversionService;

    /**
     * 主键生成器
     */
    @Resource(name = "sequenceProcGenerator")
    private ISequenceGenerator sequenceGenerator;
    

    @Override
    public DbBaseInfoPO selectByPrimaryKey(Integer key) throws BaseAppException {
        // ///////
        // TODO 根据业务场景，设置查询条件、数据校验等

        // ///////
        return dbBaseInfoDao.selectByPrimaryKey(key);
    }

    @Override
    public List<DbBaseInfoPO> selectByArg(DbBaseInfoPO record) throws BaseAppException {
        logger.debug("selectByArg begin...record={0}", record);

        // 第一种方式：自己创建arg，自行设置查询条件及操作符
        //DbBaseInfoArg arg = new DbBaseInfoArg();
        //DbBaseInfoCriteria criteria = arg.createCriteria();
        
        // 第二种方式：利用arg转换服务，转换出arg，带上查询条件及操作符，
        // 转换后，还可以自行对arg进行设置修改
        DbBaseInfoArg arg = argConversionService.invokeArg(DbBaseInfoArg.class, record);

        // ///////
        // TODO 根据业务场景，设置查询条件，示例
        // if (Utils.notEmpty(record.getUserName())) {
        // criteria.andUserNameLike(record.getUserName());
        // }
        // ///////

        return dbBaseInfoDao.selectByArg(arg);
    }

    @Override
    public Page<DbBaseInfoPO> selectByArgAndPage(DbBaseInfoPO record, Page<DbBaseInfoPO> resultPage)
            throws BaseAppException {
        logger.debug("selectByArgAndPage begin...record={0}", record);

        // 第一种方式：自己创建arg，自行设置查询条件及操作符
        // DbBaseInfoArg arg = new DbBaseInfoArg();
        // //TODO 根据业务场景，设置查询条件，示例
        // DbBaseInfoCriteria criteria = arg.createCriteria();
        // if (Utils.notEmpty(record.getUserName())) {
        // criteria.andUserNameLike(record.getUserName());
        // }

        // 第二种方式：利用arg转换服务，转换出arg，带上查询条件及操作符，
        // 转换后，还可以自行对arg进行设置修改
        DbBaseInfoArg arg = argConversionService.invokeArg(DbBaseInfoArg.class, record);

        resultPage = dbBaseInfoDao.selectByArgAndPage(arg, resultPage);


        return resultPage;
    }
    
    //数据库信息查询
    @Override
    public Page<DbBaseInfoPO> selectByArgAndPageDbInfo(DbBaseInfoPO record, Page<DbBaseInfoPO> resultPage)
    		throws BaseAppException {
    	logger.debug("selectByArgAndPage begin...record={0}", record);
    	
    	// 第一种方式：自己创建arg，自行设置查询条件及操作符
    	// DbBaseInfoArg arg = new DbBaseInfoArg();
    	// //TODO 根据业务场景，设置查询条件，示例
    	// DbBaseInfoCriteria criteria = arg.createCriteria();
    	// if (Utils.notEmpty(record.getUserName())) {
    	// criteria.andUserNameLike(record.getUserName());
    	// }
    	
    	// 第二种方式：利用arg转换服务，转换出arg，带上查询条件及操作符，
    	// 转换后，还可以自行对arg进行设置修改
//    	DbBaseInfoArg arg = argConversionService.invokeArg(DbBaseInfoArg.class, record);
    	
    	List<DbBaseInfoPO> resultList = dbBaseInfoDao.selectByArgAndPageDbInfo(record, resultPage);
    	for(DbBaseInfoPO DbList:resultList){
			if(DbList.getDbBaseId()!=null){
				DbBaseInfoVO dbiVO = baseInfoService.queryDBInfo(DbList.getDbBaseId());
				List<DbLinkInstanceVO> dbLinkInstanceList = dbiVO.getDbLinkInstance();
					for(DbLinkInstanceVO dliVO : dbLinkInstanceList){
						if(DbList.getDbLinkId().equals(dliVO.getDbLinkId())){
							List<DbUserInfoVO> dbUserInfoList = dliVO.getDbUserInfo();
							String q = "";
							for(DbUserInfoVO duiVO : dbUserInfoList){
								q=q+duiVO.getDbUserName()+" 、";
							}
							DbList.setDbUserName(q.substring(0, q.length()-1));
					}
				}
			}
		}
    	resultPage.setResultList(resultList);
    	return resultPage;
    }

    @Override
    public int add(DbBaseInfoPO record) throws BaseAppException {
        logger.debug("add begin...record={0}", record);

        // ///////
        // TODO 根据业务场景，进行重名校验、设置主键、设置属性默认值等
        // 获取主键
        // int pkId = sequenceGenerator.sequenceIntValue("表名","主键名");
        // record.setUserId(pkId);
        // record.setCreatedDate(new Date());
        // ///////

        return dbBaseInfoDao.insertSelective(record);
    }

    @Override
    public int update(DbBaseInfoPO record) throws BaseAppException {
        logger.debug("update begin...record={0}", record);

        // ///////
        // TODO 根据业务场景，进行重名校验、数据有效性校验、设置属性默认值等

        // ///////

        return dbBaseInfoDao.updateByPrimaryKeySelective(record);
    }

    @Override
    public int delete(DbBaseInfoPO record) throws BaseAppException {
        logger.debug("delete begin...record={0}", record);

        // ///////
        // TODO 根据业务场景，进行关联性校验、关联删除等

        // ///////

        return dbBaseInfoDao.deleteByPrimaryKey(record.getDbBaseId());
    }

}
